package cn.com.gridinfo.sooc.core.course.pay.activity;

import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.text.TextUtils;
import android.widget.CheckBox;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;

import com.alipay.sdk.app.PayTask;
import com.jeremy.arad.Arad;
import com.jeremy.arad.utils.Log;
import com.tencent.mm.sdk.constants.Build;
import com.tencent.mm.sdk.modelpay.PayReq;
import com.tencent.mm.sdk.openapi.IWXAPI;
import com.tencent.mm.sdk.openapi.WXAPIFactory;

import butterknife.ButterKnife;
import butterknife.InjectView;
import butterknife.OnCheckedChanged;
import butterknife.OnClick;
import cn.com.gridinfo.sooc.R;
import cn.com.gridinfo.sooc.SoocApplication;
import cn.com.gridinfo.sooc.base.BaseSoocActivity;
import cn.com.gridinfo.sooc.common.Const;
import cn.com.gridinfo.sooc.core.course.classes.activity.CourseDetailActivity;
import cn.com.gridinfo.sooc.core.course.pay.alipay.PayResult;
import cn.com.gridinfo.sooc.core.course.pay.common.CodeConst;
import cn.com.gridinfo.sooc.core.course.pay.dao.PayDao;
import cn.com.gridinfo.sooc.utils.IntentUtil;
import cn.com.gridinfo.sooc.utils.MessageUtils;

/**
 * 支付订单页面
 * Created by yingchunli on 2016/8/9.
 */
public class PayOrderActivity extends BaseSoocActivity {

    @InjectView(R.id.price)
    TextView price;//课程价钱
    @InjectView(R.id.kcmc)
    TextView kcmc;//课程名称
    @InjectView(R.id.zfb_cb)
    CheckBox zfbCb;//支付宝选中按钮
    @InjectView(R.id.weixin_cb)
    CheckBox weixinCb;//微信选中按钮
    private String kcfm, kcid;//课程封面 课程id

    private IWXAPI api;

    private PayDao payDao;

    private String from;//来源，从哪个页面来的
    String intent_kcmc;//课程名称
    String intent_price;//课程价钱

    private static final int SDK_PAY_FLAG = 1;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.course_payorder);
        ButterKnife.inject(this);
        payDao = new PayDao(this);
        intent_kcmc = getIntent().hasExtra("kcmc") ? getIntent().getStringExtra("kcmc") : "";
        intent_price = getIntent().hasExtra("price") ? getIntent().getStringExtra("price") : "";
        kcmc.setText(intent_kcmc);
        price.setText(intent_price);
        kcfm = getIntent().hasExtra("kcfm") ? getIntent().getStringExtra("kcfm") : "";
        kcid = getIntent().hasExtra("kcid") ? getIntent().getStringExtra("kcid") : "";
        from = getIntent().hasExtra("from") ? getIntent().getStringExtra("from") : "";

        //将课程信息存到本地,在支付成功之后，方便进入课程学习页
        Arad.preferences.putString("zf_kcid", kcid);
        Arad.preferences.putString("zf_kcfm", kcfm);
        Arad.preferences.flush();
        Log.d("oncreate PayOrder");
    }

    /**
     * 支付宝按钮的状态改变
     */
    @OnCheckedChanged(R.id.zfb_cb)
    void checkedChanged() {
        if (zfbCb.isChecked()) {
            weixinCb.setChecked(false);
        }
    }

    /**
     * 微信按钮的状态改变
     */
    @OnCheckedChanged(R.id.weixin_cb)
    void checkedChanged1() {
        if (weixinCb.isChecked()) {
            zfbCb.setChecked(false);
        }
    }

    /**
     * 确认支付按钮的点击
     */
    @OnClick(R.id.pay_btn)
    void onClick() {

        if (weixinCb.isChecked()) {
            //进入微信支付
            payDao.getWeixinInfo(SoocApplication.orderId);
        } else if (zfbCb.isChecked()) {
            //进入支付宝支付
            payDao.getZfbInfo(SoocApplication.orderId);
        }
    }

    //进入微信支付
    void payWeixin() {
        regToWX();
        if (!isWXAppInstalledAndSupported()) {
            //未安装应用
            MessageUtils.showImageShortToast(this, "需先安装微信，再完成支付");
        } else {
            //已安装 检查版本是否支持微信支付
            if (api.getWXAppSupportAPI() < Build.PAY_SUPPORTED_SDK_INT) {
                //不支持
                MessageUtils.showImageShortToast(this, "微信版本较低，不支持支付功能，请先升级再完成支付");
            } else {
                //支持
//                MessageUtils.showImageShortToast(this, "true");
                //获取微信支付的信息
                PayReq req = new PayReq();
                req.appId = payDao.getWeixinInfo().getAppid();//应用ID
                req.partnerId = payDao.getWeixinInfo().getPartnerid();//商户号
                req.prepayId = payDao.getWeixinInfo().getPrepayid();//预支付交易会话ID
                req.nonceStr = payDao.getWeixinInfo().getNoncestr();//扩展字段
                req.timeStamp = payDao.getWeixinInfo().getTimestamp();//随机字符串
                req.packageValue = payDao.getWeixinPackage();//时间戳
                req.sign = payDao.getWeixinInfo().getSign();//签名
//                    req.extData = "app data"; // optional
//                  Toast.makeText(this, "正常调起支付", Toast.LENGTH_SHORT).show();
                // 在支付之前，如果应用没有注册到微信，应该先调用IWXMsg.registerApp将应用注册到微信
                api.sendReq(req);
            }
        }
    }

    //进入支付宝
    void payZfb() {
        final String orderInfo = "";// 订单信
        // 必须异步调用
        Runnable payRunnable = new Runnable() {

            @Override
            public void run() {
                // 构造PayTask 对象
                PayTask alipay = new PayTask(PayOrderActivity.this);
                // 调用支付接口，获取支付结果
                String result = alipay.pay(payDao.getParam_string(), true);

                Message msg = new Message();
                msg.what = SDK_PAY_FLAG;
                msg.obj = result;
                mHandler.sendMessage(msg);
            }
        };

        // 必须异步调用
        Thread payThread = new Thread(payRunnable);
        payThread.start();
    }

    private Handler mHandler = new Handler() {

        public void handleMessage(Message msg) {
            switch (msg.what) {
                case SDK_PAY_FLAG: {
                    PayResult payResult = new PayResult((String) msg.obj);
                    /**
                     * 同步返回的结果必须放置到服务端进行验证（验证的规则请看https://doc.open.alipay.com/doc2/
                     * detail.htm?spm=0.0.0.0.xdvAU6&treeId=59&articleId=103665&
                     * docType=1) 建议商户依赖异步通知
                     */
                    String resultInfo = payResult.getResult();// 同步返回需要验证的信息

                    String resultStatus = payResult.getResultStatus();
                    // 判断resultStatus 为“9000”则代表支付成功，具体状态码代表含义可参考接口文档
                    if (TextUtils.equals(resultStatus, "9000")) {
                        Toast.makeText(PayOrderActivity.this, "支付成功", Toast.LENGTH_SHORT).show();

                    } else {
                        // 判断resultStatus 为非"9000"则代表可能支付失败
                        // "8000"代表支付结果因为支付渠道原因或者系统原因还在等待支付结果确认，最终交易是否成功以服务端异步通知为准（小概率状态）
                        if (TextUtils.equals(resultStatus, "8000")) {
                            Toast.makeText(PayOrderActivity.this, "支付结果确认中", Toast.LENGTH_SHORT).show();

                        } else {
                            // 其他值就可以判断为支付失败，包括用户主动取消支付，或者系统返回的错误
                            Toast.makeText(PayOrderActivity.this, "支付失败", Toast.LENGTH_SHORT).show();

                        }
                    }
                    break;
                }
                default:
                    break;
            }
        }

        ;
    };

    @Override
    public void onRequestSuccess(int requestCode) {
        try {
            if (payDao.getStatus().equals("0")) {
                switch (requestCode) {
                    case CodeConst.GET_ZFB_INFO:
                        //获取支付宝支付信息
                        payZfb();
                        break;

                    case CodeConst.GET_WEIXIN_INFO:
                        //获取微信支付信息
                        Const.APP_ID_WX = payDao.getWeixinInfo().getAppid();
                        payWeixin();
                        break;
                }
            } else {
                MessageUtils.showImageShortToast(this, payDao.getStatusCode());
            }
        } catch (Exception e) {
            MessageUtils.showImageShortToast(this, "数据请求异常");
        }
    }

    /**
     * 注册微信支付
     */
    private void regToWX() {
        api = WXAPIFactory.createWXAPI(this, Const.APP_ID_WX, true);
        api.registerApp(Const.APP_ID_WX);
    }

    /**
     * 判断是否安装了微信app
     *
     * @return true 安装了   false 没有安装
     */
    private boolean isWXAppInstalledAndSupported() {
        return api.isWXAppInstalled() && api.isWXAppSupportAPI();
    }

    @Override
    public String setupToolBarTitle() {
        return "支付订单";
    }

    @Override
    public boolean setupToolBarLeftButton(ImageView leftButton) {
        return true;
    }

    @OnClick(R.id.toolbar_leftbtn)
    void goBack() {
        //从购买课程来的,返回到课程详情页，否则直接关闭
        if (from.equals("buyCourse")) {
            Intent intent = new Intent();
            intent.setClass(this, CourseDetailActivity.class);
            intent.putExtra("kcid", kcid);
            intent.putExtra("kcfm", kcfm);
            intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
            intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);//它可以关掉所要到的界面中间的activity
            startActivity(intent);
        }
        finish();
    }

    @Override
    protected void onRestart() {
        super.onRestart();
        if (SoocApplication.isPayResult) {
            //从支付结果页面回来
            SoocApplication.isPayResult = false;
        } else {
            //从支付客户端异常返回
            //需要进入支付结果页面，请求数据，确认是否成功支付
            if (from.equals("orders")) {
                IntentUtil.intentSlidIn(this, PayResultActivity.class, 00);
            } else {
                IntentUtil.intentSlidIn(this, PayResultActivity.class, 00);
            }
        }
    }

    @Override
    public void onBackPressed() {
        goBack();
    }
}
